﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCObjetoNegocio;
using LinqKit;
using System.Configuration;
using System.Data;

namespace SIMCRepositorio
{
    public interface IRepositorioPortafolio
    {
        Portafolio Buscar(int? p_PortafolioId, DateTime p_Fecha, bool p_ConsolidaPosiciones = true);
        Portafolio BuscarExterno(PortafolioSearchCriteria p_Criterios, bool p_ConsolidaPosiciones = true);
        PagedResult<Portafolio> BuscarLista(PortafolioSearchCriteria p_Criterios, int start, int max, FiltroPortafolio filtros);
        PagedResult<Portafolio> BuscarListaExterna(PortafolioSearchCriteria p_Criterios, int start, int max);
        PortafolioBalance BuscarBalance(int p_IdPortafolio, DateTime p_Fecha);
        IList<PortafolioBalancePosicion> BuscarPosiciones(int p_PortafolioId, DateTime p_Fecha);
        List<PortafolioBalancePosicion> BuscarListaPosiciones(PortafolioBalancePosicionSearchCriteria p_Criterio, DateTime p_Fecha);
        IList<string> BuscarTiposPortafolioAcceso(Usuario usuario);
        List<Movimiento> BuscarMovimientos(int? p_idcuenta, DateTime? p_fecha, int? p_idtitular);

        List<AporteORetiro> BuscarListaAporteORetiros(int? p_Idportafolio, DateTime? p_FechaInicial, DateTime? p_FechaFinal);

        ResumenAportesYRetiros BuscarResumenAportesYRetiros(int? p_Idportafolio, DateTime? p_FechaInicial, DateTime? p_FechaFinal);
    }

    public class RepositorioPortafolio : Database, IRepositorioPortafolio
    {
        public Portafolio Buscar(int? p_IdPortafolio, DateTime p_Fecha, bool p_ConsolidaPosiciones = true)
        {
            try
            {
                var query = from valor in Context.adm_carteras
                            join cliente in Context.per_personas
                                on valor.car_icliente equals cliente.per_icodigo
                            join gerente in Context.per_personas
                                on valor.car_igerente equals gerente.per_icodigo
                            where valor.car_inumero == p_IdPortafolio
                            select new Portafolio
                            {
                                Id = valor.car_inumero,
                                DivisaBase = valor.car_sdiv_base,// row["car_sdiv_base"].ToString(),
                                FechaCreacion = valor.car_fapertura,// Helper.DBHelper.GetDateTime(row,"car_fapertura"),
                                IdGerente = valor.car_igerente,//  Helper.DBHelper.GetInt(row,"car_igerente"),
                                IdTitular = valor.car_icliente,// Helper.DBHelper.GetInt(row,"per_icodigo"),
                                Notas = valor.car_snotas,// row["car_snotas"].ToString(),
                                NumeroContrato = valor.car_snum_contrato,// row["car_snum_contrato"].ToString(),
                                TipoPortafolio = valor.car_stp_cartera,// row["car_stp_cartera"].ToString(),
                                NombreTitular = cliente.per_sncorto,// row["per_sncorto"].ToString(),
                                NombreGerente = gerente.per_sncorto,// row["NombreGerente"].ToString()
                                _Estado = valor.car_cestado,
                                DescripcionTipoPortafolio = valor.adm_tipos_cartera.tpc_sdescripcion,
                                TipoCarteraAdministrada = valor.car_smodelo,
                                DescripcionTipoCarteraAdministrada = (from v in Context.cla_valores
                                                                      where v.cav_satributo == Valores.TipoCarteraAdministrada && v.cav_scodigo == valor.car_smodelo
                                                                      select v.cav_sdescripcion).FirstOrDefault()

                            };

                PortafolioSearchCriteria t_Criterio = new PortafolioSearchCriteria(p_Fecha) { IdPortafolio = p_IdPortafolio};
                if (p_ConsolidaPosiciones)
                {
                    ConsolidarPosiciones(t_Criterio, query);
                }
                var query2 = BuscarPatrimonioNeto(t_Criterio, query);
                return query2.FirstOrDefault();
            }
            catch (Exception)
            {
                throw;
            }
        }
        public PagedResult<Portafolio> BuscarLista(PortafolioSearchCriteria p_Criterios, int start, int max, FiltroPortafolio filtro)
        {
            try
            {
                var listaPortafolio = BuscarListaFiltrada(p_Criterios, filtro);

                int total = listaPortafolio.Distinct().Count();

                var lista = listaPortafolio.OrderBy(p => p.Id).Skip(start).Take(max).AsEnumerable().Distinct();

                if (total > 0)
                {
                    if (p_Criterios.ConsolidarPosiciones == true)
                    {
                        ConsolidarPosiciones(p_Criterios, lista);
                    }

                    lista = BuscarPatrimonioNeto(p_Criterios, lista);
                }

                return BuildPagedResult<Portafolio>(lista, total);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public Portafolio BuscarExterno(PortafolioSearchCriteria p_Criterio, bool p_ConsolidaPosiciones = true)
        {
            var query = from valor in Context.adm_carteras
                        join usuarioPortafolio in Context.adm_portafolio_usuario
                            on valor.car_inumero equals usuarioPortafolio.usp_icartera
                        join cliente in Context.per_personas
                             on valor.car_icliente equals cliente.per_icodigo
                        join gerente in Context.per_personas
                            on valor.car_igerente equals gerente.per_icodigo
                        where valor.car_inumero == p_Criterio.IdPortafolio && usuarioPortafolio.usp_suser == p_Criterio.NombreUsuarioExterno
                        select new Portafolio
                        {
                            Id = valor.car_inumero,
                            DivisaBase = valor.car_sdiv_base,// row["car_sdiv_base"].ToString(),
                            FechaCreacion = valor.car_fapertura,// Helper.DBHelper.GetDateTime(row,"car_fapertura"),
                            IdGerente = valor.car_igerente,//  Helper.DBHelper.GetInt(row,"car_igerente"),
                            IdTitular = valor.car_icliente,// Helper.DBHelper.GetInt(row,"per_icodigo"),
                            Notas = valor.car_snotas,// row["car_snotas"].ToString(),
                            NumeroContrato = valor.car_snum_contrato,// row["car_snum_contrato"].ToString(),
                            TipoPortafolio = valor.car_stp_cartera,// row["car_stp_cartera"].ToString(),
                            Alias = usuarioPortafolio.usp_salias,// row["per_sncorto"].ToString(),
                            NombreGerente = gerente.per_sncorto,// row["NombreGerente"].ToString()         
                            IdResponsableRelacion = cliente.per_iresp_relac,
                            IdentificacionTitular = cliente.per_sid_pais,
                            DescripcionTipoPortafolio = valor.adm_tipos_cartera.tpc_sdescripcion,
                            _EstadoAsociacion = usuarioPortafolio.usp_cestado,
                            IdAsociacionUsuarioExterno = usuarioPortafolio.usp_id,
                            TipoCarteraAdministrada = valor.car_smodelo,
                            DescripcionTipoCarteraAdministrada = (from v in Context.cla_valores
                                                                  where v.cav_satributo == Valores.TipoCarteraAdministrada && v.cav_scodigo == valor.car_smodelo
                                                                  select v.cav_sdescripcion).FirstOrDefault()
                        };

            if (p_ConsolidaPosiciones)
            {
                ConsolidarPosiciones(p_Criterio, query);
            }

            var query2 = BuscarPatrimonioNeto(p_Criterio, query);

            return query2.FirstOrDefault();
        }
        public PagedResult<Portafolio> BuscarListaExterna(PortafolioSearchCriteria p_Criterios, int start, int max)
        {
            var query = from valor in Context.adm_carteras
                        join usuarioPortafolio in Context.adm_portafolio_usuario
                            on valor.car_inumero equals usuarioPortafolio.usp_icartera
                        join cliente in Context.per_personas
                             on valor.car_icliente equals cliente.per_icodigo
                        join gerente in Context.per_personas
                            on valor.car_igerente equals gerente.per_icodigo
                        where usuarioPortafolio.usp_suser == p_Criterios.NombreUsuarioExterno
                        select new Portafolio
                        {
                            Id = valor.car_inumero,
                            DivisaBase = valor.car_sdiv_base,// row["car_sdiv_base"].ToString(),
                            FechaCreacion = valor.car_fapertura,// Helper.DBHelper.GetDateTime(row,"car_fapertura"),
                            IdGerente = valor.car_igerente,//  Helper.DBHelper.GetInt(row,"car_igerente"),
                            IdTitular = valor.car_icliente,// Helper.DBHelper.GetInt(row,"per_icodigo"),
                            Notas = valor.car_snotas,// row["car_snotas"].ToString(),
                            NumeroContrato = valor.car_snum_contrato,// row["car_snum_contrato"].ToString(),
                            TipoPortafolio = valor.car_stp_cartera,// row["car_stp_cartera"].ToString(),
                            Alias = usuarioPortafolio.usp_salias,// row["per_sncorto"].ToString(),
                            NombreGerente = gerente.per_sncorto,// row["NombreGerente"].ToString()         
                            IdResponsableRelacion = cliente.per_iresp_relac,
                            IdentificacionTitular = cliente.per_sid_pais,
                            DescripcionTipoPortafolio = valor.adm_tipos_cartera.tpc_sdescripcion,
                            _EstadoAsociacion = usuarioPortafolio.usp_cestado,
                            IdAsociacionUsuarioExterno = usuarioPortafolio.usp_id,
                            NombreTitular = cliente.per_sncorto,
                            _Estado = valor.car_cestado,
                            PatrimonioNeto = 0
                        };

            List<Portafolio> portafolios = query.ToList();

            if ((portafolios != null)&&(p_Criterios.ConsolidarPosiciones))
            {
                ConsolidarPosiciones(p_Criterios, query);
            }

            var query2 = BuscarPatrimonioNeto(p_Criterios, portafolios);

            int total = query2.AsEnumerable().Count();

            var lista = query2.OrderBy(p => p.Id).Skip(start).Take(max).AsEnumerable();

            return BuildPagedResult<Portafolio>(lista, total);
        }       
        private IQueryable<Portafolio> BuscarListaFiltrada(PortafolioSearchCriteria p_Criterios, FiltroPortafolio p_MiFiltro)
        {
            try
            {
                List<adm_carteras> t_listaPortafolios = Context.sp_EjecutaQuery(p_MiFiltro.Query + " \'" + p_Criterios.Fecha.ToString("yyyy-MM-dd") + "\'," + p_Criterios.UserId + ",0").ToList();

                if (t_listaPortafolios.Count > 0)
                {
                    var query = from valor in t_listaPortafolios
                                join cliente in Context.per_personas
                                    on valor.car_icliente equals cliente.per_icodigo
                                join gerente in Context.per_personas
                                    on valor.car_igerente equals gerente.per_icodigo
                                select new Portafolio
                                {
                                    Id = valor.car_inumero,
                                    DivisaBase = valor.car_sdiv_base,// row["car_sdiv_base"].ToString(),
                                    FechaCreacion = valor.car_fapertura,// Helper.DBHelper.GetDateTime(row,"car_fapertura"),
                                    IdGerente = valor.car_igerente,//  Helper.DBHelper.GetInt(row,"car_igerente"),
                                    IdTitular = valor.car_icliente,// Helper.DBHelper.GetInt(row,"per_icodigo"),
                                    Notas = valor.car_snotas,// row["car_snotas"].ToString(),
                                    NumeroContrato = valor.car_snum_contrato,// row["car_snum_contrato"].ToString(),
                                    TipoPortafolio = valor.car_stp_cartera,// row["car_stp_cartera"].ToString(),
                                    NombreTitular = cliente.per_sncorto,// row["per_sncorto"].ToString(),
                                    NombreGerente = gerente.per_sncorto,// row["NombreGerente"].ToString()         
                                    IdResponsableRelacion = cliente.per_iresp_relac,
                                    IdentificacionTitular = cliente.per_sid_pais,
                                    DescripcionTipoPortafolio = valor.adm_tipos_cartera.tpc_sdescripcion
                                };

                    var query2 = FiltradoEstandar(p_Criterios, query.AsQueryable());

                    return query2;
                }

                return null;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private static IQueryable<Portafolio> FiltradoEstandar(PortafolioSearchCriteria p_Criterios, IQueryable<Portafolio> query)
        {
            var predicate = PredicateBuilder.True<Portafolio>();

            if (p_Criterios.IdPortafolio > 0)
            {
                predicate = predicate.And(o => o.Id == p_Criterios.IdPortafolio);
            }
            if (p_Criterios.TipoPortafolio.Count() > 0)
            {
                predicate = predicate.And(o => p_Criterios.TipoPortafolio.Contains(o.TipoPortafolio));
            }
            if (p_Criterios.GerenteId > 0)
            {
                predicate = predicate.And(o => o.IdGerente == p_Criterios.GerenteId);
            }
            if (p_Criterios.ClienteId > 0)
            {
                predicate = predicate.And(o => o.IdTitular == p_Criterios.ClienteId);
            }
            if (p_Criterios.ResponsableId != 0)
            {
                predicate = predicate.And(o => o.IdResponsableRelacion == p_Criterios.ResponsableId);
            }
            if (p_Criterios.NombreCliente != string.Empty)
            {
                predicate = predicate.And(o => o.NombreTitular.StartsWith(p_Criterios.NombreCliente));
            }
            if (p_Criterios.IdentificacionPersona != string.Empty)
            {
                predicate = predicate.And(o => o.IdentificacionTitular.Contains(p_Criterios.IdentificacionPersona));
            }

            var query2 = query.AsExpandable().Where(predicate);
            return query2;
        }
        private IEnumerable<Portafolio> BuscarPatrimonioNeto(PortafolioSearchCriteria p_Criterios, IEnumerable<Portafolio> lista)
        {

            lista = from valor in lista
                    select new Portafolio
                    {
                        Id = valor.Id,
                        DivisaBase = valor.DivisaBase,// row["car_sdiv_base"].ToString(),
                        FechaCreacion = valor.FechaCreacion,// Helper.DBHelper.GetDateTime(row,"car_fapertura"),
                        IdGerente = valor.IdGerente,//  Helper.DBHelper.GetInt(row,"car_igerente"),
                        IdTitular = valor.IdTitular,// Helper.DBHelper.GetInt(row,"per_icodigo"),
                        Notas = valor.Notas,// row["car_snotas"].ToString(),
                        NumeroContrato = valor.NumeroContrato,// row["car_snum_contrato"].ToString(),
                        TipoPortafolio = valor.TipoPortafolio,// row["car_stp_cartera"].ToString(),
                        PatrimonioNeto = (from balance in Context.adm_sumbalances
                                          where balance.rsc_icartera == valor.Id && balance.rsc_fecha == p_Criterios.Fecha
                                          select balance.rsc_dneto).Sum(), // balance.rsc_dneto,// Helper.DBHelper.GetDecimal(row, "rsc_dneto"),
                        NombreTitular = valor.NombreTitular,// row["per_sncorto"].ToString(),
                        NombreGerente = valor.NombreGerente,// row["NombreGerente"].ToString()         
                        IdResponsableRelacion = valor.IdResponsableRelacion,
                        IdentificacionTitular = valor.IdentificacionTitular,
                        DescripcionTipoPortafolio = valor.DescripcionTipoPortafolio,
                        _EstadoAsociacion = valor._EstadoAsociacion,
                        IdAsociacionUsuarioExterno = valor.IdAsociacionUsuarioExterno,
                        Alias = valor.Alias,// row["per_sncorto"].ToString(), 
                        _Estado = valor._Estado

                    };
            return lista;
        }
        private void ConsolidarPosiciones(PortafolioSearchCriteria p_Criterios, IEnumerable<Portafolio> lista)
        {
            string ids = string.Empty;
            if (lista != null)
            {
                foreach (Portafolio miPortafolio in lista)
                {
                    ids += miPortafolio.Id + ",";
                }
                ids = ids.TrimEnd(',');
               
                try
                {
                    Context.sp_ConsolidaPosiciones(p_Criterios.Fecha, ids);
                }
                catch (System.Data.EntityCommandExecutionException ex)
                {

                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }

            
        }
        public PortafolioBalance BuscarBalance(int p_IdPortafolio, DateTime p_Fecha)
        {

            try
            {
                var query = from valor in Context.adm_carteras
                            join balance in Context.adm_sumbalances
                             on valor.car_inumero equals balance.rsc_icartera
                            where balance.rsc_icartera == p_IdPortafolio && balance.rsc_fecha == p_Fecha
                            select new PortafolioBalance
                            {
                                IdPortafolio = p_IdPortafolio,
                                FechaBalance = balance.rsc_fecha,
                                FechaCalculo = balance.rsc_fcalculo,
                                DivisaBase = valor.car_sdiv_base,
                                PatrimonioNeto = balance.rsc_dneto,
                                ActivoTotal = balance.rsc_dactivos,
                                PasivoTotal = balance.rsc_dpasivos,
                                OperacionesTransitoNetas = balance.rsc_dtransito,
                                MargenActual = balance.rsc_margen_act,
                                MargenPermitido = balance.rsc_margen_req,
                                EfectivoDisponible = balance.rsc_efect_req,
                                GarantiaDisponible = balance.rsc_gar_req,
                                OperacionesPosibles = balance.rsc_vtas_req,
                                CoberturaRiesgo = balance.rsc_dcobertura
                            };

                return query.FirstOrDefault();
            }
            catch (Exception)
            {
                throw;
            }
        }
        public IList<PortafolioBalancePosicion> BuscarPosiciones(int p_IdPortafolio, DateTime p_Fecha)
        {
            try
            {
                var query = from valor in Context.adm_regbalances
                            
                            where valor.cba_fbalance == p_Fecha && valor.cba_iportafolio == p_IdPortafolio
                            select new PortafolioBalancePosicion
                            {
                                IdPortafolio = valor.cba_iportafolio,
                                FechaBalance = valor.cba_fbalance,
                                AP = valor.cba_act_pas,
                                TipoGenerico = valor.cba_stp_gen,
                                DivisaPosicion = valor.cba_sdivisa,
                                TipoDeInstrumento = valor.cba_stp_valor,
                                Valor = valor.cba_svalor,
                                Custodia = valor.cba_icustodio,
                                Descripcion = valor.cba_sdescripcion,
                                Cantidad = valor.cba_dif_cant,
                                PrecioMercado = valor.cba_dif_cant,
                                InteresesCausados = valor.cba_mif_int_x_cob,
                                ValorPosicion = valor.cba_mif_realizacion,
                                CostoAdquisicion = valor.cba_dif_prom,
                                UtilidadNoRealizada = valor.cba_mif_rev_acum,
                                TasaDeCambioABase = valor.cba_dtasa,
                                ValorPosicionBase = valor.cba_mif_tot_base
                            };

                return query.OrderBy(p => p.AP).OrderBy(p => p.DivisaPosicion).OrderBy(p => p.TipoGenerico).ToList();
            }
            catch (Exception)
            {

                throw;
            }
        }
        public List<PortafolioBalancePosicion> BuscarListaPosiciones(PortafolioBalancePosicionSearchCriteria p_Criterio, DateTime p_Fecha)
        {
            try
            {
                decimal? sumatMonto = (from valor in Context.adm_regbalances
                            where valor.cba_fbalance == p_Fecha && valor.cba_iportafolio == p_Criterio.PortafolioId && valor.cba_act_pas =="A"
                            select valor.cba_mif_tot_base).Sum();

                if (sumatMonto <= 0) sumatMonto = 1;

                var query = from valor in Context.adm_regbalances
                            join tipo in Context.val_tipos_valor on valor.cba_stp_valor equals tipo.tva_scodigo into ValTipo
                                from subValor in ValTipo.DefaultIfEmpty()
                            where valor.cba_fbalance == p_Fecha
                            select new PortafolioBalancePosicion
                            {
                                IdPortafolio = valor.cba_iportafolio,
                                FechaBalance = valor.cba_fbalance,
                                AP = valor.cba_act_pas,
                                TipoGenerico = (valor.cba_stp_gen == "CASH") ? "00" : valor.cba_stp_gen,
                                DivisaPosicion = valor.cba_sdivisa,
                                TipoDeInstrumento = valor.cba_stp_valor,
                                Valor = valor.cba_svalor,
                                Custodia = valor.cba_icustodio,
                                Descripcion = valor.cba_sdescripcion,
                                Cantidad = valor.cba_dif_cant,
                                PrecioMercado = valor.cba_dif_precio,
                                InteresesCausados = valor.cba_mif_int_x_cob,
                                ValorPosicion = valor.cba_mif_realizacion,
                                CostoAdquisicion = valor.cba_dif_prom,
                                UtilidadNoRealizada = valor.cba_mif_rev_acum,
                                TasaDeCambioABase = valor.cba_dtasa,
                                ValorPosicionBase = valor.cba_mif_tot_base,
                                PorcentajeDelActivo = (valor.cba_mif_tot_base > 0) ? ((valor.cba_mif_tot_base * 100) / sumatMonto) : ((valor.cba_mif_tot_base * -100) / sumatMonto),
                                _TipoGenericoDetallado = (subValor == null ? String.Empty : subValor.tva_sdesc)
                            };

                var query2 = FiltradoPosiciones(p_Criterio, query);               

                return query2.OrderBy(p => p.AP).OrderBy(p => p.DivisaPosicion).OrderBy(p => p.TipoGenerico).ToList();
            }
            catch (Exception)
            {

                throw;
            }
        }
        private static IQueryable<PortafolioBalancePosicion> FiltradoPosiciones(PortafolioBalancePosicionSearchCriteria p_Criterios, IQueryable<PortafolioBalancePosicion> query)
        {
            var predicate = PredicateBuilder.True<PortafolioBalancePosicion>();

            if (p_Criterios.PortafolioId > 0)
            {
                predicate = predicate.And(o => o.IdPortafolio == p_Criterios.PortafolioId);
            }
            if (p_Criterios.tipoPosicion != string.Empty)
            {
                predicate = predicate.And(o => o.TipoGenerico == p_Criterios.tipoPosicion);
            }
            if (p_Criterios.AP != string.Empty)
            {
                predicate = predicate.And(o => o.AP == p_Criterios.AP);
            }
            if (p_Criterios.divisa != string.Empty)
            {
                predicate = predicate.And(o => o.DivisaPosicion == p_Criterios.divisa);
            }

            var query2 = query.AsExpandable().Where(predicate);
            return query2;
        }  
        public IList<string> BuscarTiposPortafolioAcceso(Usuario usuario)
        {
            try
            {
                var query = (from e in
                                 (
                                     //(from valor in Context.seg_eventos
                                     // join tipos in Context.adm_tipos_cartera on valor.sev_evento equals tipos.tpc_scodigo + Valores.EventoModificar
                                     // where valor.sev_objeto == "portafolios" && (valor.sev_evento.Contains(Valores.EventoModificar))
                                     // select new { valor.sev_idevento, tipos.tpc_scodigo, valor.sev_ctp_restriccion }
                                     //).Union
                                     (
                                         from valor in Context.seg_eventos
                                         join tipos in Context.adm_tipos_cartera on valor.sev_evento equals tipos.tpc_scodigo + Valores.EventoConsultar
                                         where valor.sev_objeto == "portafolios" && (valor.sev_evento.Contains(Valores.EventoConsultar))
                                         select new { valor.sev_idevento, tipos.tpc_scodigo, valor.sev_ctp_restriccion }
                                     )
                                 )
                             select new { e.sev_idevento, e.tpc_scodigo, e.sev_ctp_restriccion }
                            ).Distinct();

                var query2 = ((from valor in query
                               where valor.sev_ctp_restriccion == "0"
                               select valor.tpc_scodigo).Distinct());

                var todosTipos = (((from derecho in Context.seg_derechos
                                    join q in query on derecho.sde_idevento equals q.sev_idevento
                                    where derecho.sde_scodigo == usuario.Rol.Id
                                    select q.tpc_scodigo).Distinct())).Union(query2).Distinct();

                return todosTipos.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<Movimiento> BuscarMovimientos(int? p_idcuenta, DateTime? p_fecha, int? p_idtitular)
        {
            try
            {

                var query = from valor in Context.sp_Movimientos(p_idcuenta, new DateTime(1990, 1, 1), p_fecha, "2", p_idtitular)
                            select new Movimiento
                            {
                                NumeroMovimiento = valor.NUMERO,
                                Signo = valor.SIGNO,
                                Fecha = valor.FECHA,
                                Descripcion = valor.DESCRIP,
                                Monto = valor.MONTO,                                
                            };

                return query.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<AporteORetiro> BuscarListaAporteORetiros(int? p_idPortafolio, DateTime? p_FechaInicio, DateTime? p_FechaFinal)
        {
            try
            {

                var query = from valor in Context.sp_AportesYRetiros(p_idPortafolio,p_FechaInicio,p_FechaFinal,1,1)
                            select new AporteORetiro
                            {
                                Fecha = valor.mot_fvalor,
                                MontoDivisaBase = valor.MontoBase,
                                Destino = valor.destino,
                                Divisa = valor.cta_sdivisa,
                                IngresoEgreso = valor.ie,
                                Monto = valor.MontoCta,
                                Referencia = valor.referencia,
                                TasaBase = valor.tasaBase,
                                TipoMovimiento = valor.ve
                            };

                return query.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public ResumenAportesYRetiros BuscarResumenAportesYRetiros(int? p_Idportafolio, DateTime? p_FechaInicial, DateTime? p_FechaFinal)
        {
            try
            {

                var query = from valor in Context.sp_ResumenAportesYRetiros(p_Idportafolio, p_FechaInicial, p_FechaFinal)
                            select new ResumenAportesYRetiros
                            {
                                Cliente = valor.Cliente,
                                DivisaBase = valor.Base,
                                Egresos = valor.EGRE,
                                IdPortafolio = valor.IdPortafolio,
                                Ingresos = valor.ING,
                                NetoFinal = valor.Neto_fin,
                                NetoInicial = valor.NETO_ini,
                                Utilidad = valor.DIFERENCIA
                            };

                return query.SingleOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
